/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controladores;

import Clases.Grado;
import Clases.Alumno;
import Clases.Gradoseccionciclo;
import Clases.Seccion;
import Clases.Catedraticocurso;
import Clases.Ciclo;
import escuela.exceptions.IllegalOrphanException;
import escuela.exceptions.NonexistentEntityException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author Bryan
 */
public class GradoseccioncicloJpaController {

    public GradoseccioncicloJpaController() {
        emf = Persistence.createEntityManagerFactory("EscuelaPU");
    }
    private EntityManagerFactory emf = null;

    public GradoseccioncicloJpaController(EntityManagerFactory emf) {
        this.emf=emf;
    }

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Gradoseccionciclo gradoseccionciclo) {
        if (gradoseccionciclo.getAlumnoCollection() == null) {
            gradoseccionciclo.setAlumnoCollection(new ArrayList<Alumno>());
        }
        if (gradoseccionciclo.getCatedraticocursoCollection() == null) {
            gradoseccionciclo.setCatedraticocursoCollection(new ArrayList<Catedraticocurso>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Seccion seccion = gradoseccionciclo.getSeccion();
            if (seccion != null) {
                seccion = em.getReference(seccion.getClass(), seccion.getIdSeccion());
                gradoseccionciclo.setSeccion(seccion);
            }
            Grado grado = gradoseccionciclo.getGrado();
            if (grado != null) {
                grado = em.getReference(grado.getClass(), grado.getIdGrado());
                gradoseccionciclo.setGrado(grado);
            }
            Ciclo ciclo = gradoseccionciclo.getCiclo();
            if (ciclo != null) {
                ciclo = em.getReference(ciclo.getClass(), ciclo.getIdCiclo());
                gradoseccionciclo.setCiclo(ciclo);
            }
            Collection<Alumno> attachedAlumnoCollection = new ArrayList<Alumno>();
            for (Alumno alumnoCollectionAlumnoToAttach : gradoseccionciclo.getAlumnoCollection()) {
                alumnoCollectionAlumnoToAttach = em.getReference(alumnoCollectionAlumnoToAttach.getClass(), alumnoCollectionAlumnoToAttach.getIdAlumno());
                attachedAlumnoCollection.add(alumnoCollectionAlumnoToAttach);
            }
            gradoseccionciclo.setAlumnoCollection(attachedAlumnoCollection);
            Collection<Catedraticocurso> attachedCatedraticocursoCollection = new ArrayList<Catedraticocurso>();
            for (Catedraticocurso catedraticocursoCollectionCatedraticocursoToAttach : gradoseccionciclo.getCatedraticocursoCollection()) {
                catedraticocursoCollectionCatedraticocursoToAttach = em.getReference(catedraticocursoCollectionCatedraticocursoToAttach.getClass(), catedraticocursoCollectionCatedraticocursoToAttach.getIdCatedraticoCurso());
                attachedCatedraticocursoCollection.add(catedraticocursoCollectionCatedraticocursoToAttach);
            }
            gradoseccionciclo.setCatedraticocursoCollection(attachedCatedraticocursoCollection);
            em.persist(gradoseccionciclo);
            if (seccion != null) {
                seccion.getGradoseccioncicloCollection().add(gradoseccionciclo);
                seccion = em.merge(seccion);
            }
            if (grado != null) {
                grado.getGradoseccioncicloCollection().add(gradoseccionciclo);
                grado = em.merge(grado);
            }
            if (ciclo != null) {
                ciclo.getGradoseccioncicloCollection().add(gradoseccionciclo);
                ciclo = em.merge(ciclo);
            }
            for (Alumno alumnoCollectionAlumno : gradoseccionciclo.getAlumnoCollection()) {
                alumnoCollectionAlumno.getGradoseccioncicloCollection().add(gradoseccionciclo);
                alumnoCollectionAlumno = em.merge(alumnoCollectionAlumno);
            }
            for (Catedraticocurso catedraticocursoCollectionCatedraticocurso : gradoseccionciclo.getCatedraticocursoCollection()) {
                Gradoseccionciclo oldGradoseccioncicloOfCatedraticocursoCollectionCatedraticocurso = catedraticocursoCollectionCatedraticocurso.getGradoseccionciclo();
                catedraticocursoCollectionCatedraticocurso.setGradoseccionciclo(gradoseccionciclo);
                catedraticocursoCollectionCatedraticocurso = em.merge(catedraticocursoCollectionCatedraticocurso);
                if (oldGradoseccioncicloOfCatedraticocursoCollectionCatedraticocurso != null) {
                    oldGradoseccioncicloOfCatedraticocursoCollectionCatedraticocurso.getCatedraticocursoCollection().remove(catedraticocursoCollectionCatedraticocurso);
                    oldGradoseccioncicloOfCatedraticocursoCollectionCatedraticocurso = em.merge(oldGradoseccioncicloOfCatedraticocursoCollectionCatedraticocurso);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Gradoseccionciclo gradoseccionciclo) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Gradoseccionciclo persistentGradoseccionciclo = em.find(Gradoseccionciclo.class, gradoseccionciclo.getIdGradoSeccionCiclo());
            Seccion seccionOld = persistentGradoseccionciclo.getSeccion();
            Seccion seccionNew = gradoseccionciclo.getSeccion();
            Grado gradoOld = persistentGradoseccionciclo.getGrado();
            Grado gradoNew = gradoseccionciclo.getGrado();
            Ciclo cicloOld = persistentGradoseccionciclo.getCiclo();
            Ciclo cicloNew = gradoseccionciclo.getCiclo();
            Collection<Alumno> alumnoCollectionOld = persistentGradoseccionciclo.getAlumnoCollection();
            Collection<Alumno> alumnoCollectionNew = gradoseccionciclo.getAlumnoCollection();
            Collection<Catedraticocurso> catedraticocursoCollectionOld = persistentGradoseccionciclo.getCatedraticocursoCollection();
            Collection<Catedraticocurso> catedraticocursoCollectionNew = gradoseccionciclo.getCatedraticocursoCollection();
            List<String> illegalOrphanMessages = null;
            for (Catedraticocurso catedraticocursoCollectionOldCatedraticocurso : catedraticocursoCollectionOld) {
                if (!catedraticocursoCollectionNew.contains(catedraticocursoCollectionOldCatedraticocurso)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Catedraticocurso " + catedraticocursoCollectionOldCatedraticocurso + " since its gradoseccionciclo field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (seccionNew != null) {
                seccionNew = em.getReference(seccionNew.getClass(), seccionNew.getIdSeccion());
                gradoseccionciclo.setSeccion(seccionNew);
            }
            if (gradoNew != null) {
                gradoNew = em.getReference(gradoNew.getClass(), gradoNew.getIdGrado());
                gradoseccionciclo.setGrado(gradoNew);
            }
            if (cicloNew != null) {
                cicloNew = em.getReference(cicloNew.getClass(), cicloNew.getIdCiclo());
                gradoseccionciclo.setCiclo(cicloNew);
            }
            Collection<Alumno> attachedAlumnoCollectionNew = new ArrayList<Alumno>();
            for (Alumno alumnoCollectionNewAlumnoToAttach : alumnoCollectionNew) {
                alumnoCollectionNewAlumnoToAttach = em.getReference(alumnoCollectionNewAlumnoToAttach.getClass(), alumnoCollectionNewAlumnoToAttach.getIdAlumno());
                attachedAlumnoCollectionNew.add(alumnoCollectionNewAlumnoToAttach);
            }
            alumnoCollectionNew = attachedAlumnoCollectionNew;
            gradoseccionciclo.setAlumnoCollection(alumnoCollectionNew);
            Collection<Catedraticocurso> attachedCatedraticocursoCollectionNew = new ArrayList<Catedraticocurso>();
            for (Catedraticocurso catedraticocursoCollectionNewCatedraticocursoToAttach : catedraticocursoCollectionNew) {
                catedraticocursoCollectionNewCatedraticocursoToAttach = em.getReference(catedraticocursoCollectionNewCatedraticocursoToAttach.getClass(), catedraticocursoCollectionNewCatedraticocursoToAttach.getIdCatedraticoCurso());
                attachedCatedraticocursoCollectionNew.add(catedraticocursoCollectionNewCatedraticocursoToAttach);
            }
            catedraticocursoCollectionNew = attachedCatedraticocursoCollectionNew;
            gradoseccionciclo.setCatedraticocursoCollection(catedraticocursoCollectionNew);
            gradoseccionciclo = em.merge(gradoseccionciclo);
            if (seccionOld != null && !seccionOld.equals(seccionNew)) {
                seccionOld.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                seccionOld = em.merge(seccionOld);
            }
            if (seccionNew != null && !seccionNew.equals(seccionOld)) {
                seccionNew.getGradoseccioncicloCollection().add(gradoseccionciclo);
                seccionNew = em.merge(seccionNew);
            }
            if (gradoOld != null && !gradoOld.equals(gradoNew)) {
                gradoOld.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                gradoOld = em.merge(gradoOld);
            }
            if (gradoNew != null && !gradoNew.equals(gradoOld)) {
                gradoNew.getGradoseccioncicloCollection().add(gradoseccionciclo);
                gradoNew = em.merge(gradoNew);
            }
            if (cicloOld != null && !cicloOld.equals(cicloNew)) {
                cicloOld.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                cicloOld = em.merge(cicloOld);
            }
            if (cicloNew != null && !cicloNew.equals(cicloOld)) {
                cicloNew.getGradoseccioncicloCollection().add(gradoseccionciclo);
                cicloNew = em.merge(cicloNew);
            }
            for (Alumno alumnoCollectionOldAlumno : alumnoCollectionOld) {
                if (!alumnoCollectionNew.contains(alumnoCollectionOldAlumno)) {
                    alumnoCollectionOldAlumno.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                    alumnoCollectionOldAlumno = em.merge(alumnoCollectionOldAlumno);
                }
            }
            for (Alumno alumnoCollectionNewAlumno : alumnoCollectionNew) {
                if (!alumnoCollectionOld.contains(alumnoCollectionNewAlumno)) {
                    alumnoCollectionNewAlumno.getGradoseccioncicloCollection().add(gradoseccionciclo);
                    alumnoCollectionNewAlumno = em.merge(alumnoCollectionNewAlumno);
                }
            }
            for (Catedraticocurso catedraticocursoCollectionNewCatedraticocurso : catedraticocursoCollectionNew) {
                if (!catedraticocursoCollectionOld.contains(catedraticocursoCollectionNewCatedraticocurso)) {
                    Gradoseccionciclo oldGradoseccioncicloOfCatedraticocursoCollectionNewCatedraticocurso = catedraticocursoCollectionNewCatedraticocurso.getGradoseccionciclo();
                    catedraticocursoCollectionNewCatedraticocurso.setGradoseccionciclo(gradoseccionciclo);
                    catedraticocursoCollectionNewCatedraticocurso = em.merge(catedraticocursoCollectionNewCatedraticocurso);
                    if (oldGradoseccioncicloOfCatedraticocursoCollectionNewCatedraticocurso != null && !oldGradoseccioncicloOfCatedraticocursoCollectionNewCatedraticocurso.equals(gradoseccionciclo)) {
                        oldGradoseccioncicloOfCatedraticocursoCollectionNewCatedraticocurso.getCatedraticocursoCollection().remove(catedraticocursoCollectionNewCatedraticocurso);
                        oldGradoseccioncicloOfCatedraticocursoCollectionNewCatedraticocurso = em.merge(oldGradoseccioncicloOfCatedraticocursoCollectionNewCatedraticocurso);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Short id = gradoseccionciclo.getIdGradoSeccionCiclo();
                if (findGradoseccionciclo(id) == null) {
                    throw new NonexistentEntityException("The gradoseccionciclo with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Short id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Gradoseccionciclo gradoseccionciclo;
            try {
                gradoseccionciclo = em.getReference(Gradoseccionciclo.class, id);
                gradoseccionciclo.getIdGradoSeccionCiclo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The gradoseccionciclo with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Catedraticocurso> catedraticocursoCollectionOrphanCheck = gradoseccionciclo.getCatedraticocursoCollection();
            for (Catedraticocurso catedraticocursoCollectionOrphanCheckCatedraticocurso : catedraticocursoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Gradoseccionciclo (" + gradoseccionciclo + ") cannot be destroyed since the Catedraticocurso " + catedraticocursoCollectionOrphanCheckCatedraticocurso + " in its catedraticocursoCollection field has a non-nullable gradoseccionciclo field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Seccion seccion = gradoseccionciclo.getSeccion();
            if (seccion != null) {
                seccion.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                seccion = em.merge(seccion);
            }
            Grado grado = gradoseccionciclo.getGrado();
            if (grado != null) {
                grado.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                grado = em.merge(grado);
            }
            Ciclo ciclo = gradoseccionciclo.getCiclo();
            if (ciclo != null) {
                ciclo.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                ciclo = em.merge(ciclo);
            }
            Collection<Alumno> alumnoCollection = gradoseccionciclo.getAlumnoCollection();
            for (Alumno alumnoCollectionAlumno : alumnoCollection) {
                alumnoCollectionAlumno.getGradoseccioncicloCollection().remove(gradoseccionciclo);
                alumnoCollectionAlumno = em.merge(alumnoCollectionAlumno);
            }
            em.remove(gradoseccionciclo);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Gradoseccionciclo> findGradoseccioncicloEntities() {
        return findGradoseccioncicloEntities(true, -1, -1);
    }

    public List<Gradoseccionciclo> findGradoseccioncicloEntities(int maxResults, int firstResult) {
        return findGradoseccioncicloEntities(false, maxResults, firstResult);
    }

    private List<Gradoseccionciclo> findGradoseccioncicloEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Gradoseccionciclo.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Gradoseccionciclo findGradoseccionciclo(Short id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Gradoseccionciclo.class, id);
        } finally {
            em.close();
        }
    }

    public int getGradoseccioncicloCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Gradoseccionciclo> rt = cq.from(Gradoseccionciclo.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
